<?php

if(!defined('BASEPATH')) {
    exit('No direct script access allowed');
}

/**
 * 函数库
 * @author 徐亚坤 hdyakun@sina.com
 */

/**
 * 判断是否链接
 * @author 徐亚坤
 */
if(!function_exists("is_http")) {
    function is_http($url)
    {
        $preg = "/(http:|https:)/";
        if(preg_match($preg, $url)) {
            return true;
        } else {
            return false;
        }
    }
}

/**
 * 判断是否存在
 * @author 徐亚坤
 */
function is_useful($url)
{
    if(!$url) {
        return false;
    }
    if(@fopen($url, 'r')) {
        return true;
    } else {
        return false;
    }
}

/**
 * 计算数组深度
 * @author 徐亚坤
 * @param array $array
 * @return int
 */
function array_depth($array)
{
    $max_depth = 1;
    foreach($array as $value) {
        if(is_array($value)) {
            $max_depth = array_depth($value) + 1;
        }
    }
    return $max_depth;
}

/**
 * 将多维数组转为一维数组
 * @author 徐亚坤
 * @param array $arr
 * @return array
 */
function array_tile($arr)
{
    // 将数值第一元素作为容器，作地址赋值。
    $ar_room =& $arr[key($arr)];
    // 第一容器不是数组进去转
    if(!is_array($ar_room)) {
        // 转为成数组
        $ar_room = array($ar_room);
    }
    // 指针下移
    next($arr);
    // 遍历
    while(list($k, $v) = each($arr)) {
        // 是数组就递归深挖，不是就转成数组
        $v = is_array($v) ? call_user_func(__FUNCTION__, $v) : array($v);
        // 递归合并
        $ar_room = array_merge_recursive($ar_room, $v);
        // 释放当前下标的数组元素
        unset($arr[$k]);
    }
    return $ar_room;
}

/**
 * 转化 \ 为 /
 * @author 徐亚坤
 * @param string $path 路径
 * @return string 路径
 */
function dir_path($path)
{
    $path = str_replace('\\', '/', $path);
    if(substr($path, -1) != '/') {
        $path = $path . '/';
    }
    return $path;
}

/**
 * 创建目录
 * @author 徐亚坤
 * @param string $path 路径
 * @param string $mode 属性
 * @return string 如果已经存在则返回true，否则为flase
 */
function dir_create($path, $root_dir, $mode = 0777)
{
    if(is_dir($path)) {
        @chmod($path, 0777);
    }
    if(is_dir($path) || $path == '') {
        return true;
    }

    $path = dir_path($path);
    // 截取不包括根目录的路径
    $path = str_replace(str_replace('\\', '/', $root_dir), '', $path);
    // 路径数组
    $temp = array_filter(explode('/', $path));
    // 当前目录
    $cur_dir = $root_dir;

    foreach($temp as $name) {
        $cur_dir .= $name . '/';
        if (@is_dir($cur_dir)) continue;
        @mkdir($cur_dir, 0777, true);
        @chmod($cur_dir, 0777);
    }
    return is_dir($root_dir.$path);
}

/**
 * 列出目录下所有文件
 * @author 徐亚坤
 * @param string $path 路径
 * @param string $exts 扩展名
 * @param array $list 增加的文件列表
 * @return array 所有满足条件的文件
 */
function dir_list($path, $exts = '', $list = array())
{
    $path = dir_path($path);
    $files = glob($path.'*');

    foreach($files as $v) {
        if(!$exts || pathinfo($v, PATHINFO_EXTENSION) == $exts) {
            $list[] = $v;
            if(is_dir($v)) {
                $list = dir_list($v, $exts, $list);
            } 
        } 
    }
    return $list;
}

/**
 * 判断字符串纯汉字 OR 纯英文 OR 汉英混合
 * @author 徐亚坤
 * @return 1: 英文，2：纯汉字，3：汉字和英文
 */
function utf8_str($str)
{
    $mb = mb_strlen($str, 'utf-8');
    $st = strlen($str);
    if($st == $mb) {
        return 1;
    }
    if($st%$mb == 0 && $st%3 == 0) {
        return 2;
    }
    return 3;
}

/**
 * 获取字符串长度，支持中文和其他编码
 * @author 徐亚坤
 * @param string $str 需要计算的字符串
 * @param string $charset 字符编码
 * @return length int
*/
function abslength($str, $charset = 'utf-8')
{
    if(empty($str)) {
        return 0;
    }
    if(function_exists('mb_strlen')) {
        return mb_strlen($str, 'utf-8');
    } else {
        @preg_match_all("/./u", $str, $ar);
        return count($ar[0]);
    }
}

/**
 * 字符串截取，支持中文和其他编码
 * @author 徐亚坤
 * @param string $str 需要转换的字符串
 * @param string $start 开始位置
 * @param string $length 截取长度
 * @param string $charset 编码格式
 * @param string $suffix 截断显示字符
 * @param string $strength 字符串的长度
 * @return string
 */
function msubstr($str, $start = 0, $length, $strength, $charset = "utf-8", $suffix = true)
{
    if(function_exists("mb_substr")) {
        if($suffix){
            if($length < $strength) {
                return mb_substr($str, $start, $length, $charset)."…";
            } else {
                return mb_substr($str, $start, $length, $charset);
            }
        } else {
            return mb_substr($str, $start, $length, $charset);
        }
    } elseif(function_exists('iconv_substr')) {
        // 是否加上点号
        if($suffix) {
            if($length < $strength) {
                return iconv_substr($str, $start, $length, $charset)."…";
            } else {
                return iconv_substr($str, $start, $length, $charset);
            }
        } else {
            return iconv_substr($str, $start, $length, $charset);
        }
    } else {
        $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
        $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
        $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
        $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
        preg_match_all($re[$charset], $str, $match);
        $slice = join("", array_slice($match[0], $start, $length));
        if($suffix) {
            return $slice."…";
        } else {
            return $slice;
        }
    }
}

/**
 * 获取请求ip
 * @author 徐亚坤
 * @return ip 地址
 */
function ip()
{
    if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
        $ip = getenv('HTTP_CLIENT_IP');
    } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
        $ip = getenv('REMOTE_ADDR');
    } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return preg_match('/[\d\.]{7,15}/', $ip, $matches) ? $matches[0] : '';
}

/**
 * 返回经addslashes处理过的字符串或数组
 * @author 徐亚坤
 * @param  $string 需要处理的字符串或数组
 * @return mixed
 */
function new_addslashes($string)
{
    if(!is_array($string)) {
        return addslashes ($string);
    }
    foreach($string as $key => $val) {
        $string[$key] = new_addslashes($val);
    }
    
    return $string;
}

/**
 * 返回经stripslashes处理过的字符串或数组
 * @author 徐亚坤
 * @param  $string 需要处理的字符串或数组
 * @return mixed
 */
function new_stripslashes($string)
{
    if(!is_array($string)) {
        return stripslashes($string);
    }
    foreach($string as $key => $val) {
        $string[$key] = new_stripslashes($val);
    }

    return $string;
}

/**
 * 返回经unserialize处理过的数组
 * @author 徐亚坤
 * @param $string 需要处理的字符串
 * @return mixed
 */
function new_unserialize($data)
{
    if(($ret = unserialize($data)) === false) {
        $ret = unserialize(stripslashes($data));
    }
    return $ret;
}

/**
 * 安全过滤函数
 *
 * @param  $string
 * @return string
 */
function safe_replace($string)
{
    $string = str_replace('%20', '', $string);
    $string = str_replace('%27', '', $string);
    $string = str_replace('%2527', '', $string);
    $string = str_replace('*', '', $string);
    $string = str_replace('"', '&quot;', $string);
    $string = str_replace("'", '', $string);
    $string = str_replace('"', '', $string);
    $string = str_replace(';', '', $string);
    $string = str_replace('<', '&lt;', $string);
    $string = str_replace('>', '&gt;', $string);
    $string = str_replace("{", '', $string);
    $string = str_replace('}', '', $string);
    $string = str_replace('\\', '', $string);
    return $string;
}

/**
 * 获取当前页面完整URL地址
 */
function get_url()
{
    if(isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == '443') {
        $sys_protocal = 'https://';
    } else {
        $sys_protocal = 'http://';
    }
    if($_SERVER['PHP_SELF']) {
        $php_self = safe_replace($_SERVER['PHP_SELF']);
    } else {
        $php_self = safe_replace($_SERVER['SCRIPT_NAME']);
    }
    $path_info = isset($_SERVER['PATH_INFO']) ? safe_replace($_SERVER['PATH_INFO']) : '';
    $relate_url = isset($_SERVER['REQUEST_URI']) ? safe_replace($_SERVER['REQUEST_URI']) : $php_self.(isset($_SERVER['QUERY_STRING']) ? '?'.safe_replace($_SERVER['QUERY_STRING']) : $path_info);
    return $sys_protocal.(isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '').$relate_url;
}

/**
 * 根据URL获取数组
 * @param  string
 * @return array
 */
function get_url_arr($url)
{
    $params = array();
    $query = parse_url($url, PHP_URL_QUERY);

    if($query) {
        $queryParts = explode('&', $query);
    }
    if(isset($queryParts)) {
        foreach ($queryParts as $param) {
            $item = explode('=', $param);
            $params[$item[0]] = $item[1];
        }
    }
    return $params;
}

/**
 * 生成随机字符串
 * @param  int
 * @return string
 */
function random($length, $chars = '0123456789')
{
    $numeric = preg_match('/^[0-9]+$/', $chars) ? 1 : 0;
    $seed = base_convert(md5(microtime().$_SERVER['DOCUMENT_ROOT']), 16, $numeric ? 10 : 35);
    $seed = $numeric ? (str_replace('0', '', $seed).'012340567890') : ($seed.'zZ'.strtoupper($seed));
    if($numeric) {
        $hash = '';
    } else {
        $hash = chr(rand(1, 26) + rand(0, 1) * 32 + 64);
        $length--;
    }
    $max = strlen($seed) - 1;
    for($i = 0; $i < $length; $i++) {
        $hash .= $seed{mt_rand(0, $max)};
    }
    return $hash;
}

/**
* 生成随机字符串
* @param  $lenth int 长度
*/
function create_randomstr($lenth = 6)
{
    return random($lenth, '123456789abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ');
}

/**
 * 获取图片信息
 *
 * @param  图片地址
 * @return bool || array
 */
function image_info($file)
{
    if(!file_exists($file) && !@fopen($file, 'r')) {
        return false;
    }
    $imageinfo = getimagesize($file);
    if($imageinfo === false) {
        return false;
    }
    $imagetype = strtolower(substr(image_type_to_extension($imageinfo[2]), 1));
    $imagesize = filesize($file);
    return array('file' => $file,
        'width' => $imageinfo[0],
        'height' => $imageinfo[1],
        'type' => $imagetype,
        'size' => $imagesize,
        'mime' => $imageinfo['mime']
    );
}

/**
 * 转换字节数为其他单位
 *
 * @param  $filesize string
 * @return string
 */
function sizecount($filesize)
{
    $s = array('Bytes', 'KB', 'MB', 'GB', 'TB', 'PB');
    $e = floor(log($filesize, 1024));
    return sprintf('%.2f '.$s[$e], $filesize/pow(1024, $e));
}

/**
 * 转换字符串中的变量占位符为数组中的值
 * @param  string array
 * @return string
 */
function variable_replace($string, $array)
{
    foreach($array as $k => $v) {
        $string = str_replace('{'.$k.'}', $v, $string);
    }
    return $string;
}

/**
 * 根据用户ID生成图像地址
 * @param  int
 * @return string
 */
function make_dir_by_userid($userid)
{
    $dir = substr(md5($userid), 0, 2);
    return $dir;
}

/**
 * 根据ID生成图像地址
 * @param  int
 * @return string
 */
function make_dir_by_id($id)
{
    $dir = substr(md5($id), 0, 2);
    return $dir;
}

/**
 * 获取请求方式
 * @param  string
 * @return string
 */
function get_request_method($default = 'get')
{
    if(isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD']) {
        return strtolower($_SERVER['REQUEST_METHOD']);
    }
    return $default;
}

if(!function_exists('iconv'))
{
    /**
     * 系统不开启 iconv 模块时, 自建 iconv(), 使用 MB String 库处理
     *
     * @param  string
     * @param  string
     * @param  string
     * @return string
     */
    function iconv($from_encoding = 'GBK', $target_encoding = 'UTF-8', $string)
    {
        return convert_encoding($string, $from_encoding, $target_encoding);
    }
}

/**
 * 兼容性转码
 *
 * 系统转换编码调用此函数, 会自动根据当前环境采用 iconv 或 MB String 处理
 *
 * @param  string
 * @param  string
 * @param  string
 * @return string
 */
function convert_encoding($string, $from_encoding = 'GBK', $target_encoding = 'UTF-8')
{
    if(function_exists('mb_convert_encoding')) {
        return mb_convert_encoding($string, str_replace('//IGNORE', '', strtoupper($target_encoding)), $from_encoding);
    } else {
        if(strtoupper($from_encoding) == 'UTF-16') {
            $from_encoding = 'UTF-16BE';
        }

        if(strtoupper($target_encoding) == 'UTF-16') {
            $target_encoding = 'UTF-16BE';
        }

        if(strtoupper($target_encoding) == 'GB2312' or strtoupper($target_encoding) == 'GBK') {
            $target_encoding .= '//IGNORE';
        }

        return iconv($from_encoding, $target_encoding, $string);
    }
}

/**
 * 输出调试数据
 * @param  mixed 数据
 * @param  bool 是否相关信息
 * @param  bool 是否退出
 * @return void
 */
if(!function_exists("pp")) {
    function pp($data, $exit = true, $dump = false)
    {
        echo "<pre>";
        $dump || print_r($data);
        $dump && var_dump($data);
        echo "</pre>";
        $exit && exit();
    }
}

/**
 * 判断是否是手机客户端
 * @return boolean
 */
function is_mobile($ignore = false)
{
    if($ignore) {
        return false;
    }

    $user_agent = strtolower($_SERVER['HTTP_USER_AGENT']);

    if(preg_match('/playstation/i', $user_agent) OR preg_match('/ipad/i', $user_agent) OR preg_match('/ucweb/i', $user_agent)) {
        return false;
    }

    if(preg_match('/iemobile/i', $user_agent) OR preg_match('/mobile\ssafari/i', $user_agent) OR preg_match('/iphone\sos/i', $user_agent) OR preg_match('/android/i', $user_agent) OR preg_match('/symbian/i', $user_agent) OR preg_match('/series40/i', $user_agent)) {
        return true;
    }

    return false;
}

/**
 * 判断是否处于微信内置浏览器中
 * @return boolean
 */
function in_weixin()
{
    $user_agent = strtolower($_SERVER['HTTP_USER_AGENT']);

    if (preg_match('/micromessenger/i', $user_agent)) {
        return true;
    }

    return false;
}